#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;

void GetChild(int signo)
{
    // pid_t id;
    // while( (id = waitpid(-1, NULL, WNOHANG)) > 0)
    // {
    //     printf("wait child success: %d\n", id);
    // }
    cout << "get a signal: " << signo << " pid: " << getpid() << endl;
}

int main()
{
    pid_t id = fork();
    //signal(SIGCHLD, GetChild);
    signal(SIGCHLD, SIG_IGN);//显示设置忽略17号信号，当进程退出时
                             //自动释放僵尸进程
    
    if(id == 0)
    {
        //child
        int cnt = 5;
        while(cnt)
        {
            cout << "我是子进程" << endl;
            sleep(1);
            cnt--;
        }
        exit(0);
    }

    while(1);
    return 0;
}




// void handler(int signo)
// {
//     cout << "get a signo: " << signo << endl;
// }
// int main()
// {
//     struct sigaction act;
//     memset(&act, 0, sizeof(act));
//     act.sa_handler = handler;//执行方法

//     //本质是修改当前进程的handler函数指针数组特定内容
//     sigaction(2, &act, nullptr);
//     while(1)
//     {
//         cout << "hello world" << endl;
//         sleep(1);
//     }

//     return 0;
// }




// void show_pending(sigset_t* set)
// {
//     for(int i = 1; i <= 31; i++)
//     {
//         if(sigismember(set, i))
//         {
//             cout << "1" ;
//         }
//         cout << "0";
//     }
//     cout << endl << endl;
// }

// void handler(int signo)
// {
//     cout << signo << "号信号被抵达，已经处理完成。" << endl;
// }




// int main()
// {
//     //虽然sigset_t 是一个位图结构，但是不同的OS实现是不一样的，不能让用户直接修改该变量
//     //需要使用特定的函数

//     //set是一个变量，该变量和int一样，都是在用户栈上

//     signal(2, handler);
//     //设置信号屏蔽字
//     sigset_t iset, oset;

//     //初始化信号屏蔽字
//     sigemptyset(&iset);
//     sigemptyset(&oset);

//     //添加信号屏蔽字,屏蔽2号信号
//     sigaddset(&iset, 2);

//     //获取当前进程老的屏蔽字
//     sigprocmask(SIG_SETMASK, &iset, &oset);

//     int count = 0;
//     sigset_t pending;
//     while(1)
//     {
//         sigemptyset(&pending);
//         sigpending(&pending);
//         show_pending(&pending);
//         sleep(1);

//         count++;
//         if(count == 10)
//         {
//             //对二号信号就行恢复。
//             sigprocmask(SIG_SETMASK, &oset, nullptr);
//             cout << "恢复2号信号，可以被抵达了" << endl;
//         }
//     }
//     return 0;
// }